package com.huawei.zyb.taskManager.domain.requirement.repository;

import com.huawei.zyb.taskManager.domain.requirement.entity.ReferenceDocument;
import com.huawei.zyb.taskManager.domain.requirement.valueobject.ReferenceDocumentId;
import com.huawei.zyb.taskManager.domain.requirement.valueobject.RequirementId;
import com.huawei.zyb.taskManager.domain.requirement.valueobject.DocumentType;

import java.util.List;
import java.util.Optional;

/**
 * 参考文档仓储接口
 * 定义参考文档的持久化契约
 */
public interface ReferenceDocumentRepository {
    
    /**
     * 保存参考文档
     */
    ReferenceDocument save(ReferenceDocument document);
    
    /**
     * 根据ID查找参考文档
     */
    Optional<ReferenceDocument> findById(ReferenceDocumentId documentId);
    
    /**
     * 根据需求ID查找所有参考文档
     */
    List<ReferenceDocument> findByRequirementId(RequirementId requirementId);
    
    /**
     * 根据需求ID和文档类型查找参考文档
     */
    List<ReferenceDocument> findByRequirementIdAndType(RequirementId requirementId, DocumentType type);
    
    /**
     * 根据需求ID统计参考文档数量
     */
    long countByRequirementId(RequirementId requirementId);
    
    /**
     * 根据需求ID和文档类型统计参考文档数量
     */
    long countByRequirementIdAndType(RequirementId requirementId, DocumentType type);
    
    /**
     * 查找最近查看的参考文档
     */
    List<ReferenceDocument> findRecentlyViewedByRequirementId(RequirementId requirementId, int limit);
    
    /**
     * 查找查看次数最多的参考文档
     */
    List<ReferenceDocument> findMostViewedByRequirementId(RequirementId requirementId, int limit);
    
    /**
     * 根据ID删除参考文档
     */
    void deleteById(ReferenceDocumentId documentId);
    
    /**
     * 根据需求ID删除所有参考文档
     */
    void deleteByRequirementId(RequirementId requirementId);
    
    /**
     * 检查参考文档是否存在
     */
    boolean existsById(ReferenceDocumentId documentId);
    
    /**
     * 检查需求下是否存在指定URL的文档
     */
    boolean existsByRequirementIdAndUrl(RequirementId requirementId, String url);
    
    /**
     * 查找所有参考文档
     */
    List<ReferenceDocument> findAll();
    
    /**
     * 根据文档类型查找参考文档
     */
    List<ReferenceDocument> findByType(DocumentType type);
    
    /**
     * 根据上传者查找参考文档
     */
    List<ReferenceDocument> findByUploader(String uploader);
    
    /**
     * 查找最近的参考文档
     */
    List<ReferenceDocument> findRecentDocuments(int limit);
    
    /**
     * 删除参考文档
     */
    void delete(ReferenceDocument document);
}